package net.lgy.apitest.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import net.lgy.apitest.model.DO.TestEnvironmentDO;
import net.lgy.apitest.service.TestEnvironmentService;
import net.lgy.util.JsonData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 测试环境配置Controller
 */
@RestController
@RequestMapping("/api/environment/v1")
@Tag(name = "测试环境配置", description = "测试环境的增删改查操作")
public class TestEnvironmentController {

    @Autowired
    private TestEnvironmentService testEnvironmentService;

    /**
     * 新增测试环境
     */
    @PostMapping
    @Operation(summary = "新增测试环境", description = "创建一个新的测试环境配置")
    public JsonData createEnvironment(@RequestBody TestEnvironmentDO environmentDO, @RequestHeader("accountNo") Long accountNo) {
        // 使用setter方法设置属性
        environmentDO.setAccountNo(accountNo);
        boolean result = testEnvironmentService.save(environmentDO);
        if (result) {
            // 使用getter方法获取属性
            TestEnvironmentDO savedDO = testEnvironmentService.getById(environmentDO.getId());
            if (savedDO != null) {
                // 直接返回DO对象，避免使用VO
                return JsonData.buildSuccess(savedDO);
            }
        }
        return JsonData.buildError("创建测试环境失败");
    }

    /**
     * 更新测试环境
     */
    @PutMapping("/{id}")
    @Operation(summary = "更新测试环境", description = "更新指定ID的测试环境配置")
    public JsonData updateEnvironment(@PathVariable Long id, @RequestBody TestEnvironmentDO environmentDO, @RequestHeader("accountNo") Long accountNo) {
        // 使用setter方法设置属性
        environmentDO.setId(id);
        environmentDO.setAccountNo(accountNo);
        
        // 先查询验证权限
        TestEnvironmentDO existing = testEnvironmentService.getById(id);
        if (existing != null && existing.getAccountNo().equals(accountNo)) {
            boolean result = testEnvironmentService.updateById(environmentDO);
            if (result) {
                TestEnvironmentDO updatedDO = testEnvironmentService.getById(id);
                // 直接返回DO对象，避免使用VO
                return JsonData.buildSuccess(updatedDO);
            }
        }
        return JsonData.buildError("更新测试环境失败");
    }

    /**
     * 删除测试环境
     */
    @DeleteMapping("/{id}")
    @Operation(summary = "删除测试环境", description = "删除指定ID的测试环境配置")
    public JsonData deleteEnvironment(@PathVariable Long id, @RequestHeader("accountNo") Long accountNo) {
        // 先查询验证权限
        TestEnvironmentDO existing = testEnvironmentService.getById(id);
        if (existing != null && existing.getAccountNo().equals(accountNo)) {
            boolean result = testEnvironmentService.removeById(id);
            return result ? JsonData.buildSuccess("删除成功") : JsonData.buildError("删除失败");
        }
        return JsonData.buildError("删除失败");
    }

    /**
     * 获取测试环境详情
     */
    @GetMapping("/{id}")
    @Operation(summary = "获取测试环境详情", description = "根据ID获取测试环境的详细信息")
    public JsonData getEnvironment(@PathVariable Long id, @RequestHeader("accountNo") Long accountNo) {
        TestEnvironmentDO environmentDO = testEnvironmentService.getById(id);
        if (environmentDO != null && environmentDO.getAccountNo().equals(accountNo)) {
            // 直接返回DO对象，避免使用VO
            return JsonData.buildSuccess(environmentDO);
        }
        return JsonData.buildError("测试环境不存在");
    }

    /**
     * 获取所有测试环境
     */
    @GetMapping("/list")
    @Operation(summary = "获取所有测试环境", description = "获取所有测试环境配置列表")
    public JsonData listEnvironments(@RequestHeader("accountNo") Long accountNo) {
        List<TestEnvironmentDO> environmentDOs = testEnvironmentService.getByAccountNo(accountNo);
        // 直接返回DO列表
        return JsonData.buildSuccess(environmentDOs);
    }

    /**
     * 获取默认测试环境
     */
    @GetMapping("/default")
    @Operation(summary = "获取默认测试环境", description = "获取系统默认的测试环境配置")
    public JsonData getDefaultEnvironment(@RequestHeader("accountNo") Long accountNo) {
        TestEnvironmentDO defaultDO = testEnvironmentService.getDefaultEnvironment();
        if (defaultDO != null && defaultDO.getAccountNo().equals(accountNo)) {
            // 直接返回DO对象，避免使用VO
            return JsonData.buildSuccess(defaultDO);
        }
        return JsonData.buildError("未找到默认测试环境");
    }
    
    /**
     * 设置默认测试环境
     */
    @PutMapping("/{id}/default")
    @Operation(summary = "设置默认测试环境", description = "将指定ID的测试环境设为默认环境")
    public JsonData setDefaultEnvironment(@PathVariable Long id, @RequestHeader("accountNo") Long accountNo) {
        boolean result = testEnvironmentService.setDefaultEnvironment(id, accountNo);
        return result ? JsonData.buildSuccess("设置默认环境成功") : JsonData.buildError("设置默认环境失败");
    }
}